var formidable = require('formidable');
var path = require('path');
var url = require('url');
var fs = require('fs');
var xlsx = require('node-xlsx');
var Student = require('../models/Student')
var Course = require('../models/Course')
var mongoose = require('mongoose')
var format = require('date-format')


function showAdminStudentIndex(req, res) {
    res.render("admin/student", {
        page: 'student'
    });
}

function showAdminStudentImport(req, res) {
    res.render("admin/student/import", {
        page: 'student'
    });
}

function showAdminStudentAdd (req, res) {
    res.render('admin/student/add', {
        page: 'student'
    });
}


function doAdminStudentImport (req, res) {
    var form = new formidable.IncomingForm();
    form.uploadDir = './uploads/';
    form.keepExtensions = true;
    form.parse(req, function (err, fields, files) {
        // console.log(files);
        if (files.studentExcel.size === 0) {
            res.send("请上传文件");
            return
        }

        const workSheetsFromFile = xlsx.parse(files.studentExcel.path);

        var grade = ['初一', '初二', '初三', '高一', '高二', '高三'];
        var password = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
        var tempPwd = "";

        //表头校验
        for (var i = 0; i < workSheetsFromFile.length; i++) {
            if (workSheetsFromFile[i].data[0][0] !== '学号' || workSheetsFromFile[i].data[0][1] !== '姓名') {
                res.send('上传的Excel表表头不正确，请校验！')
                return
            }
        }

        //先新建一个临时的students数据库，防止出的时候出现错误
        var stu_db = new Student({
            sid: '00000',
            sname: '00000'
        })

        stu_db.save(function (err) {
            if (!err) {
                //把临时新建的students表删除掉
                mongoose.connection.collection('students').drop( function(err) {
                    if (err) {
                        res.send('原有的数据删除失败，数据库出现问题了')
                        return
                    }
                    console.log('数据库原有的数据删除成功')
                    for ( var i = 0; i < workSheetsFromFile.length; i++ ) {
                        for (var j = 1; j < workSheetsFromFile[i].data.length; j ++) {
                            //生成随机密码算法
                            var tempPwd = "";
                            for (var k = 0; k < 6; k++) {
                                tempPwd += password[Math.ceil((password.length-1)*Math.random())];
                            }
                            var temp = workSheetsFromFile[i].data[j];
                            if (!temp[0]) {   //因表格问题，可能会出现undefine的情况，需要处理下
                                break
                            }
                            // 保存遍历到的每个学生
                            var stu = new Student({
                                sid: parseInt(temp[0]),
                                sname: temp[1],
                                sex: temp[2],
                                grade: grade[i],
                                password: tempPwd,
                                changePassword: false
                            });
                            stu.save();
                        }
                    }
                    makeCourseEmpty();   //清空课程里面的学生
                    res.send(`
                        <div style="display: inline-block;background-color: #339933;padding: 10px 30px;color: #FFFFFF;border-radius: 6px">
                            你的Excel表已经上传成功，请回到学生清单中查看
                        </div>
                    `);
                });
            }
        })
    })
}

function getAllStudentInfo (req, res) {
    var query = url.parse(req.url, true).query;
    var sortType = query.sord === 'asc' ? 1 : -1;
    var keyword = query.keyword;
    var findFilter = {}
    if (keyword !== null && keyword !== undefined && keyword !== "") {
        var reg = new RegExp(keyword, 'g');
        findFilter = {
            $or: [
                { 'sid': reg },
                { 'sname': reg },
                { 'grade': reg }
            ]
        }
    }
    Student.count(findFilter, function (err, count) {
        // count共多少条记录
        // page共多少页
        // sortType排序方式
        // total, records, rows
        var total = Math.ceil(count / query.rows);
        var rows = parseInt(query.rows) || count
        var startRead = (parseInt(query.page) -1) * rows;
        Student.find(findFilter).sort({[query.sidx]: sortType}).skip(startRead).limit(rows).exec('find', function (err, result) {

            result.forEach(function (item) {
                if (item.changePassword) {
                    item.password = '学生已修改默认密码'
                }
            })

            res.json({records: count, rows: result, total: total})
        })
    })
    // res.send("12")
}

function setOneStudentInfo(req, res) {
    var sid = req.params.sid;
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, files) {
        // console.log(fields);
        var key = fields.changeName;

        var value = fields[fields.changeName];
        Student.find({ 'sid': sid }, function (err, result) {
            var stu = result[0];
            stu[key] = value;

            console.log(key);
            if (key === 'password') {
                stu.changePassword = false
            }

            stu.save(function (err) {
                if (!err) {
                    res.send({ result: '1' })
                }
            });
        })
    })
}

function doAdminStudentAdd (req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, fiels) {
        //后台再次校验前台传过来的表单
        //校验姓名
            var sname = fields.sname;
            var sname_reg = /^[\u4E00-\u9FA5]{2,4}$/;
            if (!sname_reg.test(sname)) {
                res.send({ result: '-3' })  //-3表示姓名格式不正确
                console.log('姓名格式不正确');
                return
            }

        //校验密码
        var password = fields.password;
        var lv = checkStrength(password);
        if (lv < 2) {
            res.send({ result: '-4' })  //-3表示密码强度不正确
            console.log('密码强度不正确');
            return
        }

        // 校验学号
        var sid = fields.sid;
        var sid_reg = /^[\d]{9}$/
        if (!sid_reg.test(sid)) {
            res.send({ result: -1 })   //-1表示学号格式不正确
            console.log('学号格式不正确')
            return
        }else {
            //校验学号是否存在
            Student.find({ 'sid': sid }, function (err, result) {
                if (result.length !== 0) {
                    res.send({ result: -2 })   //-2表示学号已经存在
                    // console.log('学号已经存在')
                    return
                }else {
                    //上面的查询属于回调过程，需要返回信息后，才能把学生信息插入数据库
                    var student = new Student({
                        sid: fields.sid,
                        sname : fields.sname,
                        sex: fields.sex,
                        grade: fields.grade,
                        password: fields.password,
                        changePassword: false
                    });
                    student.save(function (err) {
                        if (err) {
                            res.send({result: '学生信息添加失败！'});
                        }else {
                            res.send({result: '1'});  //1表示成功添加
                        }
                    })
                }
            })
        }

    })
}

function findStudentExist (req, res) {
    var sid = req.params.sid;
    Student.find({ 'sid': sid }, function (err, count) {
        res.send({ result: count.length, rows: count[0] });
    })
}

// 密码强度校验
function checkStrength (val){
    var lv = 0;
    if (val.match(/[a-z]/g)) {
        lv ++;
    }
    if (val.match(/[0-9]/g)){
        lv ++;
    }
    if (val.match(/(.[^a-z0-9])/g)){
        lv ++;
    }
    if (val.length < 6){
        lv = 0;
    }
    if (lv > 3){
        lv = 3;
    }
    return lv
};

function deleteStudent (req, res) {
    var form = new formidable.IncomingForm();
    form.parse(req, function (err, fields, fiels) {
        Student.remove({ 'sid': fields.sel_rows }, function (err, obj) {
            if (err) {
                res.send({ result: -1 })  //-1表示删除过程中发生了错误
            }else {
                res.send({ result: obj.n })
            }
        })
    })
}

function downloadStudentInfo (req, res) {
//    先生成一个excel表
//    1.先从数据库读取数据，但是需要注意的是，需要需要按初一、初二一直到高三的顺序进行填入表中
    var excelData = [];
    var grade = ['初一', '初二', '初三', '高一', '高二', '高三'];
    // var rows = [];  注意
    function generatorData (index) {
        if (index === 6) {
            var buffer = xlsx.build(excelData);
            var fileName = format.asString('yyyy年MM月dd日hh时mm分ss秒SSS', new Date())
            fs.writeFile('./public/assets/xlsx/' + fileName + '.xlsx', buffer, function (err) {
                if (err) {
                    // console.log(err);
                    // console.log('写入失败');
                    res.send({result: -1})
                }else {
                    // console.log('写入成功')
                    res.redirect('../assets/xlsx/' + fileName + '.xlsx');
                }
                return
            });
        }
        Student.find({ 'grade': grade[index] }, function (err, result) {
            if (err) {
                res.send('生成数据时查询出错！')
                return
            }
            var rows = [ ['学号', '姓名', '性别', '年级', '密码'] ];  //注意这个变量的定义位置，如果定义在上面，得到的每一个子表的数据都是一样的
            result.forEach(function (item) {
                rows.push([
                    item.sid,
                    item.sname,
                    item.sex,
                    item.grade,
                    item.password
                ])
            });
            excelData.push({
                name: grade[index],
                data: rows
            })
            generatorData( ++index );
        })
    }

    generatorData(0);

}

function showMyCourse (req, res) {
    if (!req.session.isLogin) {
        res.redirect('/login')
        return
    }
    res.render('admin/student/myCourse', {
        sid: req.session.sid,
        sname: req.session.sname,
        grade: req.session.grade,
        courses: req.session.courses
    })
}

function makeCourseEmpty () {
    //清空所有学生的选课信息
    Course.find({}).select(['students']).exec('find', function (err, cou) {
        // console.log(stu);
        cou.forEach(function (item) {
            item.students = []
            item.save()
        })
        console.log('课程清空成功')
    })
}

// makeCourseEmpty()

module.exports = {
    showAdminStudentIndex,
    showAdminStudentImport,
    showAdminStudentAdd,
    doAdminStudentImport,
    getAllStudentInfo,
    setOneStudentInfo,
    doAdminStudentAdd,
    findStudentExist,
    deleteStudent,
    downloadStudentInfo,
    showMyCourse
}